// 最小化UART驱动（16550A兼容）
// 仅实现输出功能，用于内核调试和信息打印

#include "uart.h"

// UART寄存器地址（基地址0x10000000）
#define UART_BASE 0x10000000
#define UART_THR (UART_BASE + 0)  // 发送保持寄存器（写）
#define UART_LSR (UART_BASE + 5)  // 线路状态寄存器（读）

// LSR寄存器bit5：发送保持寄存器为空（THRE）
#define LSR_TX_EMPTY (1 << 5)

void uart_init(void)
{
    // 对于QEMU virt平台，UART已经被固件初始化
    // 我们只需要确保能够发送数据
    // 实际硬件可能需要设置波特率等参数
}

// 等待UART发送就绪
static void uart_wait_ready() {
    // 循环检查THRE位，直到发送寄存器空闲
    while ((*(volatile unsigned char *)UART_LSR & LSR_TX_EMPTY) == 0);
}

// 输出单个字符
void uart_putc(char c) {
    uart_wait_ready();
    // 写入发送寄存器（硬件自动发送）
    *(volatile unsigned char *)UART_THR = c;
}

// 输出字符串（自动处理换行符）
void uart_puts(char *s) {
    for (int i = 0; s[i] != '\0'; i++) {
        // 对换行符补充回车（终端显示需要）
        if (s[i] == '\n') {
            uart_putc('\r');
        }
        uart_putc(s[i]);
    }
}
